package com.spider.dao.hbasefilter;

import org.apache.hadoop.hbase.client.Result;

import java.util.List;

public interface HBaseFilter {
	/**
	 * 行过滤器：筛选出匹配的所有的行，支持基于行键过滤数据，精确匹配
	 *
	 * @param tableName
	 *            表名
	 * @param rowkey
	 *            行键名
	 * @return
	 */
	public List<Result> RowFilter(String tableName, String rowkey);

	/**
	 * 行过滤器：筛选出匹配的所有的行，支持基于行键过滤数据，精确匹配，筛选出指定列族、列名的值
	 *
	 * @param tableName
	 *            表名
	 * @param rowkey
	 *            行键名
	 * @param family
	 *            列族名
	 * @param qualifier
	 *            列名
	 * @return
	 */
	public List<Result> RowFilter(String tableName, String rowkey, String family, String qualifier);

	/**
	 * 行过滤器：筛选出匹配的所有的行，使用正则表达式来匹配行键
	 *
	 * @param tableName
	 *            表名
	 * @param rowkeyRegex
	 *            行键正则表达式
	 * @return
	 */
	public List<Result> RowRegexFilter(String tableName, String rowkeyRegex);

	/**
	 * 行过滤器：筛选出匹配的所有的行，使用子串匹配方法
	 *
	 * @param tableName
	 * @param rowkeySubString
	 * @return
	 */
	public List<Result> RowSubFilter(String tableName, String rowkeySubString);

	/**
	 * 列族过滤器
	 *
	 * @param tableName
	 * @param family
	 * @return
	 */
	public List<Result> FamilyFilter(String tableName, String family);

	/**
	 * 列名过滤器
	 *
	 * @param tableName
	 * @param qualifier
	 * @return
	 */
	public List<Result> QualifierFilter(String tableName, String qualifier);

	/**
	 * 筛选从第limit列到limit+offsetr列的数据
	 *
	 * @param tableName
	 *            表名
	 * @param limit
	 *            从第几列开始筛选
	 * @param offset
	 *            列偏移量
	 * @return
	 */
	public List<Result> ColumnPaginationFilter(String tableName, int limit, int offset);

	/**
	 * 筛选与特定前缀匹配的列的键
	 *
	 * @param tableName
	 *            表名
	 * @param prefix
	 *            列前缀
	 * @return
	 */
	public List<Result> ColumnPrefixFilter(String tableName, String prefix);

	/**
	 * 基于列范围(不是行范围）过滤数据
	 *
	 * @param tableName
	 *            表名
	 * @param minColumn
	 *            列起始位置名称
	 * @param minColumnInclusive
	 *            是否包含起始位置
	 * @param maxColumn
	 *            列终止位置名称
	 * @param maxColumnInclusive
	 *            是否包含终止位置
	 */
	public List<Result> ColumnRangeFilter(String tableName, String minColumn, boolean minColumnInclusive,
                                          String maxColumn, boolean maxColumnInclusive);

	/**
	 * 基于列范围和行范围过滤数据
	 *
	 * @param tableName
	 *            表名
	 * @param minColumn
	 *            列起始位置名称
	 * @param minColumnInclusive
	 *            是否包含起始位置
	 * @param maxColumn
	 *            列终止位置名称
	 * @param maxColumnInclusive
	 *            是否包含终止位置
	 * @param startRow
	 *            行开始名称
	 * @param stopRow
	 *            行终止名称
	 * @return
	 */
	public List<Result> ColumnRangeFilter(String tableName, String minColumn, boolean minColumnInclusive,
                                          String maxColumn, boolean maxColumnInclusive, String startRow, String stopRow);

	/**
	 * 该过滤器仅仅返回每一行中的第一个cell的值，可以用于高效的执行行数统计操作。
	 *
	 * @param tableName
	 *            表名
	 * @return
	 */
	public List<Result> FirstKeyOnlyFilter(String tableName);

	/**
	 * 这是RowFilter的一种特例，它基于行健的前缀值进行过滤，它相当于给扫描构造函数Scan(byte[] startRow, byte[]
	 * stopRow)
	 *
	 * @param tableName
	 *            表名
	 * @param rowLike
	 * @return
	 */
	public List<Result> PrefixFilter(String tableName, String rowLike);

	/**
	 * 只会返回每行的行键+列簇+列，而不返回值，值全部为空
	 *
	 * @param tableName
	 *            表名
	 * @return
	 */
	public List<Result> KeyOnlyFilter(String tableName);

	public List<Result> KeyOnlyFilter(String tableName, String family, String qualifier);

	/**
	 * 按照一定的几率（<=0会过滤掉所有的行，>=1会包含所有的行）来返回随机的结果集，对于同样的数据集，多次使用同一个RandomRowFilter会返回不通的结果集，对于需要随机抽取一部分数据的应用场景，可以使用此过滤器
	 *
	 * @param tableName
	 *            表名
	 * @param chance
	 *            几率
	 * @return
	 */
	public List<Result> RandomRowFilter(String tableName, float chance);

	/**
	 * 值过滤器：按照具体的值来筛选单元格的过滤器
	 *
	 * @param tableName
	 * @param value:valueLike
	 * @return
	 */
	public List<Result> ValueFilter(String tableName, String value);

	/**
	 *  返回最后一条记录
	 * @param tableName
	 * @return
	 */
	public Result lastRowKeyFilter(String tableName);
}
